/**
 *
 */
package com.jintian.smart.kernel.common.expr.op.define;

import com.jintian.smart.kernel.core.expr.IllegalExpressionException;
import com.jintian.smart.kernel.common.expr.datameta.BaseDataMeta;
import com.jintian.smart.kernel.common.expr.datameta.Constant;
import com.jintian.smart.kernel.common.expr.op.Operator;

/**
 * 逻辑非操作
 *
 */
public class Op_NOT extends Op_Base {
    public Op_NOT() {
        super(Operator.NOT);
    }

    public Constant execute(Constant[] args) throws IllegalExpressionException {
        Object[] params = this.getParameterValues(args);
        return new Constant(BaseDataMeta.DataType.DATATYPE_BOOLEAN, !((Boolean) params[0]));
    }

    public Constant verify(int opPositin, BaseDataMeta[] args) throws IllegalExpressionException {
        this.checkParameterCount(opPositin, args);
        if (!args[0].getDataType().equals(BaseDataMeta.DataType.DATATYPE_BOOLEAN)
                && !args[0].getDataType().equals(BaseDataMeta.DataType.DATATYPE_OBJECT)) {
            throw new IllegalExpressionException("操作符\"" + this.getOperator().getToken() + "\"参数类型错误",
                    this.getOperator().getToken(), opPositin);
        }
        return new Constant(BaseDataMeta.DataType.DATATYPE_BOOLEAN, Boolean.FALSE);
    }
}
